import random
import csv
from datetime import datetime, timedelta
import json
from config import dummy_data_dir

# 应用排名字典
app_rankings = {
    1: '微信',
    2: '抖音',
    3: '支付宝',
    4: '淘宝',
    5: '拼多多',
    6: '高德地图',
    7: 'QQ',
    8: '快手',
    9: '百度',
    10: '京东',
    11: '小红书',
    12: '微博',
    13: '美团',
    14: '滴滴出行',
    15: '哔哩哔哩',
    16: '饿了么',
    17: 'WPS Office',
    18: '腾讯视频',
    19: '爱奇艺',
    20: '携程',
    21: '夸克',
    22: '百度网盘',
    23: 'Soul',
    24: '知乎',
    25: '百度地图',
    26: '网易新闻',
    27: '虎牙直播',
    28: '番茄小说',
    29: '剪映',
    30: '懂车帝'
}

class FluxBehaviorGenerator:
    def __init__(self):
        self.mobile_numbers = []
        self.user_plans = {}
        self.load_user_data()
    
    def load_user_data(self):
        """从CSV文件加载用户数据"""
        csv_path = os.path.join(dummy_data_dir, '用户入网信息表.csv').replace(os.sep, '/')
        try:
            with open(csv_path, 'r', encoding='utf-8') as file:
                reader = csv.DictReader(file)
                for row in reader:
                    mobile = str(row['Mobile Number'])
                    self.mobile_numbers.append(mobile)
                    # 存储套餐信息，包括流量额度
                    self.user_plans[mobile] = {
                        'data_allowance': float(row['Data Allowance (GB)']),
                        'plan_name': row['Plan Name']
                    }
            print(f"成功加载 {len(self.mobile_numbers)} 个用户数据")
        except Exception as e:
            print(f"加载用户数据失败: {e}")
    
    def select_app_by_ranking(self):
        """根据排名选择应用，排名越小概率越高"""
        # 使用加权随机选择，排名越小权重越大
        weights = [31 - rank for rank in range(1, 31)]  # 权重递减
        selected_rank = random.choices(range(1, 31), weights=weights, k=1)[0]
        return app_rankings[selected_rank]
    
    def generate_flux_records_for_user_day(self, mobile, date):
        """为单个用户生成一天内的多条流量行为记录（基于app类型每分钟流量消耗计算）"""
        plan_info = self.user_plans[mobile]
        data_allowance_gb = plan_info['data_allowance']
        
        # 每天生成20-40条记录（考虑实际使用频率）
        records_count = random.randint(20, 40)
        daily_records = []
        
        # 根据用户套餐类型生成合理的每日流量使用（不设置硬性限额）
        user_type = random.choice(['轻度', '中度', '重度'])
        
        if user_type == '轻度':
            daily_total_mb = random.uniform(10, 500)
        elif user_type == '中度':
            daily_total_mb = random.uniform(500, 2048)
        else:  # 重度
            daily_total_mb = random.uniform(2048, 5120)
        
        # 流量计算基于app类型和实际使用时长，不再使用每日总流量分配
        
        # 应用类型对应的上网时长范围（分钟）
        app_duration_ranges = {
            '微信': (5, 30),      # 社交类：5-30分钟
            '抖音': (15, 180),    # 短视频：15分钟-3小时
            '支付宝': (2, 15),    # 支付类：2-15分钟
            '淘宝': (10, 60),     # 购物类：10-60分钟
            '拼多多': (10, 45),   # 购物类：10-45分钟
            '高德地图': (5, 20),   # 工具类：5-20分钟
            'QQ': (5, 30),       # 社交类：5-30分钟
            '快手': (15, 120),    # 短视频：15分钟-2小时
            '百度': (3, 15),      # 搜索类：3-15分钟
            '京东': (10, 60),     # 购物类：10-60分钟
            '小红书': (10, 90),   # 社交类：10-90分钟
            '微博': (5, 25),      # 社交类：5-25分钟
            '美团': (5, 20),      # 生活类：5-20分钟
            '滴滴出行': (5, 15),  # 出行类：5-15分钟
            '哔哩哔哩': (20, 240), # 视频类：20分钟-4小时
            '饿了么': (3, 10),    # 生活类：3-10分钟
            'WPS Office': (10, 120), # 办公类：10分钟-2小时
            '腾讯视频': (20, 180),  # 视频类：20分钟-3小时
            '爱奇艺': (20, 180),   # 视频类：20分钟-3小时
            '携程': (10, 45),     # 出行类：10-45分钟
            '夸克': (3, 15),      # 浏览器：3-15分钟
            '百度网盘': (5, 30),  # 工具类：5-30分钟
            'Soul': (10, 60),    # 社交类：10-60分钟
            '知乎': (10, 60),     # 知识类：10-60分钟
            '百度地图': (5, 20),   # 工具类：5-20分钟
            '网易新闻': (5, 30),  # 资讯类：5-30分钟
            '虎牙直播': (15, 120), # 直播类：15分钟-2小时
            '番茄小说': (15, 120),  # 阅读类：15分钟-2小时
            '剪映': (15, 90),     # 创作类：15-90分钟
            '懂车帝': (10, 45)     # 资讯类：10-45分钟
        }
        
        # 应用类型对应的每分钟流量消耗（MB/分钟）
        app_flux_per_minute = {
            '微信': {'上行': 0.1, '下行': 0.3},      # 社交类：文字聊天为主
            '抖音': {'上行': 0.2, '下行': 8.0},      # 短视频：大量下载视频
            '支付宝': {'上行': 0.1, '下行': 0.2},    # 支付类：少量数据交换
            '淘宝': {'上行': 0.1, '下行': 2.0},     # 购物类：图片浏览
            '拼多多': {'上行': 0.1, '下行': 1.5},    # 购物类：图片浏览
            '高德地图': {'上行': 0.1, '下行': 1.0},   # 工具类：地图数据下载
            'QQ': {'上行': 0.1, '下行': 0.3},       # 社交类：文字聊天为主
            '快手': {'上行': 0.2, '下行': 7.0},     # 短视频：大量下载视频
            '百度': {'上行': 0.1, '下行': 0.5},     # 搜索类：网页浏览
            '京东': {'上行': 0.1, '下行': 2.0},     # 购物类：图片浏览
            '小红书': {'上行': 0.2, '下行': 3.0},    # 社交类：图文浏览
            '微博': {'上行': 0.1, '下行': 1.0},     # 社交类：图文浏览
            '美团': {'上行': 0.1, '下行': 1.0},     # 生活类：图片浏览
            '滴滴出行': {'上行': 0.1, '下行': 0.5},  # 出行类：地图和定位
            '哔哩哔哩': {'上行': 0.2, '下行': 10.0},  # 视频类：高清视频流
            '饿了么': {'上行': 0.1, '下行': 0.8},    # 生活类：图片浏览
            'WPS Office': {'上行': 0.5, '下行': 1.0}, # 办公类：文档同步
            '腾讯视频': {'上行': 0.2, '下行': 12.0},   # 视频类：高清视频流
            '爱奇艺': {'上行': 0.2, '下行': 12.0},    # 视频类：高清视频流
            '携程': {'上行': 0.1, '下行': 1.5},      # 出行类：图片和地图
            '夸克': {'上行': 0.1, '下行': 0.8},     # 浏览器：网页浏览
            '百度网盘': {'上行': 0.5, '下行': 5.0},  # 工具类：文件同步
            'Soul': {'上行': 0.2, '下行': 1.5},    # 社交类：图文浏览
            '知乎': {'上行': 0.1, '下行': 1.0},     # 知识类：图文浏览
            '百度地图': {'上行': 0.1, '下行': 1.0},  # 工具类：地图数据下载
            '网易新闻': {'上行': 0.1, '下行': 1.0},  # 资讯类：图文浏览
            '虎牙直播': {'上行': 0.3, '下行': 8.0},  # 直播类：高清直播流
            '番茄小说': {'上行': 0.1, '下行': 0.5},   # 阅读类：文本下载
            '剪映': {'上行': 2.0, '下行': 1.0},     # 创作类：视频上传
            '懂车帝': {'上行': 0.1, '下行': 2.0}     # 资讯类：图片浏览
        }
        
        for i in range(records_count):
            # 选择应用
            app = self.select_app_by_ranking()
            
            # 根据应用类型设置合理的上网时长
            min_duration, max_duration = app_duration_ranges.get(app, (5, 60))
            online_duration = random.randint(min_duration, max_duration)
            
            # 根据应用类型计算每分钟流量消耗
            flux_config = app_flux_per_minute.get(app, {'上行': 0.1, '下行': 0.5})
            upload_per_min = flux_config['上行']
            download_per_min = flux_config['下行']
            
            # 计算总流量（考虑使用波动，±20%）
            usage_variation = random.uniform(0.8, 1.2)
            upload_mb = upload_per_min * online_duration * usage_variation
            download_mb = download_per_min * online_duration * usage_variation
            
            # 生成具体时间（避开睡眠时段：23:00-7:00）
            active_hours = list(range(7, 23))  # 7:00-22:59
            hour = random.choice(active_hours)
            minute = random.randint(0, 59)
            second = random.randint(0, 59)
            exact_time = date.replace(hour=hour, minute=minute, second=second)
            
            # 计算费用（基于上行+下行流量总和）
            total_flux_mb = upload_mb + download_mb
            
            daily_records.append({
                'Mobile Number': mobile,
                'Timestamp': exact_time.strftime('%Y-%m-%d %H:%M:%S'),
                'Upload Traffic (MB)': round(upload_mb, 2),
                'Download Traffic (MB)': round(download_mb, 2),
                'Online Duration (Minutes)': online_duration,
                'App Used': app,
                'Cost (RMB)': 0  # 费用按天计算，在每日汇总时更新
            })
        
        return daily_records
    
    def generate_flux_behavior(self):
        """生成所有用户的流量行为数据（2024年1月1日到1月14日，每天多条记录）"""
        all_data = []
        
        # 设置固定的时间范围：2024年1月1日到1月14日
        start_date = datetime(2024, 1, 1)
        end_date = datetime(2024, 1, 14)
        
        for mobile in self.mobile_numbers:
            plan_info = self.user_plans[mobile]
            data_allowance_gb = plan_info['data_allowance']
            
            # 为每个用户生成每天的数据
            current_date = start_date
            while current_date <= end_date:
                # 生成该用户当天的多条记录
                daily_records = self.generate_flux_records_for_user_day(mobile, current_date)
                
                # 计算当日总流量和费用
                daily_total_flux = sum([record['Upload Traffic (MB)'] + record['Download Traffic (MB)'] for record in daily_records])
                daily_used_gb = daily_total_flux / 1024
                
                if daily_used_gb <= data_allowance_gb:
                    daily_cost = 0  # 未超过套餐
                else:
                    # 超出套餐部分按0.3元/MB计算
                    extra_mb = daily_total_flux - (data_allowance_gb * 1024)
                    daily_cost = extra_mb * 0.3 / 1024
                
                # 更新每条记录的费用（按天均摊或全部分配给最后一条）
                for record in daily_records:
                    record['Cost (RMB)'] = round(daily_cost / len(daily_records), 2)
                
                all_data.extend(daily_records)
                current_date += timedelta(days=1)
        
        # 按时间排序
        all_data.sort(key=lambda x: x['Timestamp'])
        return all_data
    
    def save_to_csv(self, data):
        """保存数据到CSV文件"""
        if data:
            output_path = os.path.join(dummy_data_dir, '流量行为表.csv').replace(os.sep, '/')
            
            with open(output_path, 'w', newline='', encoding='utf-8-sig') as file:
                writer = csv.DictWriter(file, fieldnames=['Mobile Number', 'Timestamp', 'Upload Traffic (MB)', 'Download Traffic (MB)', 'Online Duration (Minutes)', 'App Used', 'Cost (RMB)'])
                writer.writeheader()
                writer.writerows(data)
            
            print(f"流量行为数据已保存到: {output_path}")
            print(f"共生成 {len(data)} 条记录")
            
            # 显示统计信息
            total_cost = sum([d['Cost (RMB)'] for d in data])
            total_upload = sum([d['Upload Traffic (MB)'] for d in data])
            total_download = sum([d['Download Traffic (MB)'] for d in data])
            
            print(f"\n统计信息:")
            print(f"总上行流量: {total_upload:.2f} MB")
            print(f"总下行流量: {total_download:.2f} MB")
            print(f"总费用: {total_cost:.2f} 元")
        else:
            print("没有数据需要保存")

def main():
    """主函数"""
    print("开始生成流量行为数据...")
    
    # 创建生成器实例
    generator = FluxBehaviorGenerator()
    
    # 生成2024年1月1日到1月14日的流量行为数据
    flux_data = generator.generate_flux_behavior()
    
    # 保存到CSV文件
    generator.save_to_csv(flux_data)
    
    print("流量行为数据生成完成！")

if __name__ == "__main__":
    main()